home *** CD-ROM | disk | FTP | other *** search
- /*
- Test code for the SlidingTiles Programmer's Challenge
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "Main.h"
- #include "TileMain.h"
- #include "Solve.h"
-
- /* NOTE: kMaxSize may be larger in the actual test data */
- #define kMaxSize 33L
-
- #define kMaxShort 0xffff
-
- static Boolean gDone = false;
- static WindowPtr gWind;
-
- /*
- Initialize Toolbox, menu bar, and animation window.
- */
- static void Init()
- {
- Handle mbar;
-
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- mbar = GetNewMBar(kMBarID);
- SetMenuBar(mbar);
- AppendResMenu(GetMenuHandle(kAppleMenu), 'DRVR');
- DrawMenuBar();
-
- gWind = GetNewWindow(kTilesWindow,nil,(WindowPtr)-1);
- SetPort(gWind);
- TextFont(geneva);
- TextSize(9);
- }
-
- /*
- Execute a menu command.
- */
- static OSErr DoCommand (long mResult, short modifiers)
- {
- GrafPtr savePort;
- WindowPtr wind;
- DialogPtr dlg;
- OSErr err = noErr;
- Handle iHandle;
- Rect iRect;
- Str255 daName,textStr;
- long rows,cols,cases;
- short menu, item, itemHit, iType;
-
- menu = HiWord(mResult);
- item = LoWord(mResult);
- wind = FrontWindow();
-
- switch (menu) {
-
- case kAppleMenu:
- switch (item) {
- default:
- GetPort(&savePort);
- SetCursor(&qd.arrow);
- GetMenuItemText(GetMenuHandle(kAppleMenu), item, daName);
- OpenDeskAcc(daName);
- SetPort(savePort);
- break;
- }
- break;
-
- case kFileMenu:
- switch (item) {
- case kQuitItem:
- gDone = true;
- break;
- }
- break;
-
- case kTestCaseMenu:
- switch (item) {
- case kNewProblemItem:
- GetPort(&savePort);
- dlg = GetNewDialog(kNewProblemDlg,nil,(WindowPtr)-1);
- SetPort(dlg);
- GetDItem(dlg,kNumCols,&iType,&iHandle,&iRect);
- SelIText(dlg,kNumCols,0,0xffff);
- do {
- ModalDialog(nil,&itemHit);
- } while (cancel<itemHit);
- if (ok == itemHit) {
- GetDItem(dlg,kNumRows,&iType,&iHandle,&iRect);
- GetIText(iHandle,textStr);
- StringToNum(textStr,&rows);
- GetDItem(dlg,kNumCols,&iType,&iHandle,&iRect);
- GetIText(iHandle,textStr);
- StringToNum(textStr,&cols);
- }
- SetPort(savePort);
- HideWindow(dlg);
- DisposeDialog(dlg);
- if (ok == itemHit) {
- if ((rows>1) && (rows<=kMaxSize) &&
- (cols>1) && (cols<=kMaxSize))
- RunOneCase(gWind,rows,cols);
- }
- break;
- case kRunSeveralItem:
- GetPort(&savePort);
- dlg = GetNewDialog(kRunSeveralDlg,nil,(WindowPtr)-1);
- SetPort(dlg);
- GetDItem(dlg,kNumToRun,&iType,&iHandle,&iRect);
- SelIText(dlg,kNumToRun,0,0xffff);
- do {
- ModalDialog(nil,&itemHit);
- } while (cancel<itemHit);
- if (ok == itemHit) {
- GetDItem(dlg,kNumToRun,&iType,&iHandle,&iRect);
- GetIText(iHandle,textStr);
- StringToNum(textStr,&cases);
- }
- SetPort(savePort);
- HideWindow(dlg);
- DisposeDialog(dlg);
- if (ok == itemHit) while (0 < cases--) {
- rows = 2 + ((unsigned long)Random()&kMaxShort)*(kMaxSize-2)/kMaxShort;
- cols = 2 + ((unsigned long)Random()&kMaxShort)*(kMaxSize-2)/kMaxShort;
- RunOneCase(gWind,rows,cols);
- }
- break;
- }
- break;
-
- }
-
- HiliteMenu(0);
-
- return err;
- }
-
- /*
- Handle a key down event
- */
- static OSErr HandleKey (EventRecord *ev)
- {
- unsigned char theChar;
- short modifiers;
- long menuCmd;
-
- theChar = ev->message & charCodeMask;
- modifiers = ev->modifiers;
-
- if ((modifiers & cmdKey) != 0) {
- menuCmd = MenuKey(theChar);
- if (HiWord(menuCmd) != 0) return DoCommand(menuCmd, modifiers);
- }
- return noErr;
- }
-
- /*
- Handle a mouse down event
- */
- static OSErr HandleMouseDown (EventRecord *ev)
- {
- WindowPtr front, wind;
- Point where;
- OSErr err = noErr;
- short modifiers,part;
-
- front = FrontWindow();
- part = FindWindow(ev->where, &wind);
- where = ev->where;
- modifiers = ev->modifiers;
-
- switch (part) {
-
- case inMenuBar:
- err = DoCommand(MenuSelect(where), modifiers);
- break;
-
- case inSysWindow:
- SystemClick(ev, wind);
- break;
- }
-
- return err;
-
- }
-
- /*
- Event loop code
- */
- static void MainEvent()
- {
- EventRecord ev;
- OSErr err = noErr;
- Boolean gotEvt;
-
- while (!gDone) {
- gotEvt = WaitNextEvent(everyEvent, &ev, 0, nil);
-
- if (gotEvt) switch (ev.what) {
- case activateEvt:
- break;
- case updateEvt:
- DoUpdate((WindowPtr)ev.message);
- break;
- case mouseDown:
- err = HandleMouseDown(&ev);
- break;
- case keyDown:
- case autoKey:
- err = HandleKey(&ev);
- break;
- }
- }
- }
-
- void main(void)
- {
- Init();
- MaxApplZone();
- MainEvent();
- }
-
-